const tools = {
	// 防抖函数、延迟
	debounce: function(func, delay) {
	  	var timer = null;
	  	return function () {
	  		var self = this, args = arguments;
	  		timer && clearTimeout(timer);
	    	timer = setTimeout(function() {
	      		func.apply(self, args);
	    	}, delay)
	  	}
	},
	// 节流函数，间隔N毫秒触发一次
	throttle: function(func, delay) {
		var timer,
        args = arguments,
        start;
	    return function loop() {
	        var self = this;
	        var now = Date.now();
	        if(!start){
	            start = now;
	        }
	        if(timer){
	            clearTimeout(timer);
	        }
	        if(now - start >= delay){
	            func.apply(self, args);
	            start = now;
	        }else {
	            timer = setTimeout(function () {
	                loop.apply(self, args);
	            }, 50);
	        }
	    }
	},
	// 日期格式化，示例：tools.formatDate('2018-10-24', 'yyyy-MM-dd hh:mm:ss')
	formatDate: function(d, fmt) {
		if(!d) return '';
		if(typeof d === 'string' || typeof d == 'number') {
			// now时返回当前时间
			if(d == 'now') {
				d = new Date();
			}else{
				d = new Date(d);
			}
		}
		if(!fmt) fmt = 'yyyy-MM-dd';
		var o = { 
	        "M+" : d.getMonth() + 1,                 //月份 
	        "d+" : d.getDate(),                    //日 
	        "h+" : d.getHours(),                   //小时 
	        "m+" : d.getMinutes(),                 //分 
	        "s+" : d.getSeconds(),                 //秒 
	        "q+" : Math.floor((d.getMonth() + 3) / 3), //季度 
	        "S"  : d.getMilliseconds()             //毫秒 
	    }; 
	    if(/(y+)/.test(fmt)) {
	        fmt = fmt.replace(RegExp.$1, (d.getFullYear() + "").substr(4 - RegExp.$1.length)); 
	    }
	    for(var k in o) {
	        if(new RegExp("("+ k +")").test(fmt)){
	            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
	        }
	    }
	    return fmt;
	},
	// 判断对象是否为‘{}’
	isEmptyObject: function(obj) {
		// JSON.stringify(obj) == "{}"，用这个方法也可以
		for(var key in obj) {
			return false;
		}
		return true;
	},
	// 获取对象的类型
	getObjectClass: function(o) {
		if(o===null) return "Null";
    	if(o===undefined) return "Undefined";
    	if(Array.isArray(o)) return "Array";
    	return Object.prototype.toString.call(o).slice(8,-1);
	},
	// 深度克隆
	deepClone: function(o) {
		var r;
		var oc = this.getObjectClass(o);
		// 判断类型，对象类型继续往下进行深度克隆，原生类型直接返回
		if(oc === 'Object') {
			r = {};
		}else if(oc === 'Array') {
			r = [];
		}else{
			return o;
		}
		
		// 进行克隆，当类型为对象和数组是，递归调用遍历
		for(var k in o){
	        if(this.getObjectClass(o[k]) === "Object" || this.getObjectClass(o[k]) === 'Array'){
	            r[k] = this.deepClone(o[k]);
	        }else{
	            r[k] = o[k];
	        }
	    }
		
	    return r;
	}
}

export default tools;